from extract_pptx_same_dir import extract_pptx
import os
def get_animation_count_xml(pptx_path):
    ex_dir = extract_pptx(pptx_path)
    ex_dir = ex_dir + '/ppt/slides'
    click_count_list = count_click_effects(ex_dir)
    print('动画数量是：', click_count_list)
    return click_count_list


def count_click_effects(ex_dir):
    """
    统计指定文件夹下所有XML文件中'nodeType="clickEffect"'字符串的出现次数
    
    Args:
        ex_dir (str): 目标文件夹路径
    
    Returns:
        list: 按文件名升序排列的字符串出现次数列表
    """
    # 初始化结果列表
    click_count_list = []
    
    # 1. 验证文件夹是否存在
    if not os.path.isdir(ex_dir):
        raise NotADirectoryError(f"指定的文件夹不存在或不是有效目录: {ex_dir}")
    
    # 2. 获取所有XML文件并按文件名升序排序
    xml_files = []
    for filename in os.listdir(ex_dir):
        if filename.lower().endswith('.xml'):
            file_path = os.path.join(ex_dir, filename)
            # 跳过目录（防止文件名带.xml的文件夹）
            if not os.path.isdir(file_path):
                xml_files.append(filename)
    
    # 按文件名数字升序排序
    def extract_number(filename):
        # 从文件名中提取数字部分
        import re
        match = re.search(r'slide(\d+)\.xml', filename, re.IGNORECASE)
        return int(match.group(1)) if match else 0
    
    xml_files.sort(key=extract_number)
    
    # 3. 遍历排序后的XML文件
    for filename in xml_files:
        # 构建文件完整路径
        file_path = os.path.join(ex_dir, filename)
        
        try:
            # 读取文件内容并统计字符串出现次数
            # 使用utf-8编码读取，兼容大多数XML文件，失败则尝试gbk
            try:
                with open(file_path, 'r', encoding='utf-8') as f:
                    content = f.read()
            except UnicodeDecodeError:
                with open(file_path, 'r', encoding='gbk') as f:
                    content = f.read()
            
            # 统计目标字符串出现次数
            import re
            # count = content.count(r'nodeType="clickEffect">')
            str_find = 'nodeType="clickEffect"'
            pattern = re.compile(re.escape(str_find))  # re.escape避免特殊字符干扰
            # 统计匹配次数
            count = len(pattern.findall(content))
            click_count_list.append(count)
            
        except Exception as e:
            # 记录读取失败的文件，次数记为0
            print(f"警告：读取文件 {filename} 失败: {str(e)}")
            click_count_list.append(0)
    
    return click_count_list

# 示例使用
if __name__ == "__main__":
    # 指定目标文件夹路径
    # ex_dir = "input5/ppt/slides"  # 对应之前解压缩的PPTX文件夹
    pptx_path = 'input3.pptx'
    try:
        # 执行统计
        # result = count_click_effects(ex_dir)
        result = get_animation_count_xml(pptx_path=pptx_path)
        print("单击动画次数统计结果：", result)            
    except Exception as e:
        print(f"统计失败: {str(e)}")
